home *** CD-ROM | disk | FTP | other *** search
- LPR-Modula hat ja einige Fehler, besonders bei den Bibliotheken, aber
- ärgerlich sind die Fehler im Laufzeitsystem, weil man sich hierfür nicht
- einfach ein neues Modul schreiben kann (geht schon, ist aber aufwendig, da
- in Assembler). Bisher sind mir fünf Fehler im Zusammenhang mit der
- (LONG)REAL-Arithmetik aufgefallen, die mit dem hier beschriebenen Patch-
- Programm auch beseitigt werden können, als da wären:
-
- - Die LONGREAL-Division arbeitet nicht mit der erforderlichen
- Genauigkeit (ca. 10 statt 16 Dezimalstellen). Das hat nicht
- nur auf die eigentliche Division Einfluß, sondern auch auf die
- Verarbeitung von LONGREAL-Konstanten durch den Compiler, denn
- bei der Umwandlung der Zeichenketten in die interne Darstellung
- als 8-Byte-Wert wird ebenfalls die LONGREAL-Division benötigt.
-
- - Die Konvertierung von LONGREAL zu REAL arbeitet nicht immer
- korrekt (Bei der Rundung wird ein Mantissenüberlauf nicht
- richtig behandelt), hierfür ist die Funktion SHORT in der LONGREAL-
- Variante zuständig. Hier kann es vorkommen, daß eine Zahl mit
- ausschließlich Neunen in der Mantisse nicht auf die nächsthöhere Zahl
- aufgerundet wird, sondern auf das eineinhalbfache.
- Dies betrifft aber genauso REAL-Konstanten, denn diese werden vom
- Compiler als LONGREAL-Konstanten eingelesen und dann erst mit
- SHORT nach REAL konvertiert.
-
- - Bei LPR arbeiten ja die Standardfunktionen nicht mit CARDINAL
- sondern mit INTEGER, sodaß auch TRUNC, FLOAT, TRUNCD und FLOATD
- auf negative Zahlen angewendet werden können. Leider behandelt
- FLOAT negative Zahlen nicht korrekt.
-
- - Die Standardfunktion TRUNCD meldet schon bei -2147483648.0D einen
- Überlauf, obwohl dies eigentlich erst bei -2147483649.0D der Fall
- wäre.
-
- - Der Vergleich zweier LONGREAL-Zahlen arbeitet nicht immer korrekt.
- Es kann sein, dass eine Zahl, die größer ist als eine andere,
- plötzlich für die kleinere gehalten wird. Das passiert, wenn
- die beiden oberen Mantissenhälften übereinstimmen, und die eine
- untere Mantissenhälfte, als Zweierkomplementzahl interpretiert,
- negativ ist (also oberstes Bit gesetzt).
-
-
-
- Die fehlerhaften Routinen sitzen an zwei Stellen: Einmal im Modul
- 'System' und ein zweitesmal sitzt das komplette Modul 'System' im Modul
- 'M2Shell'. 'M2Shell' ist für die Laufzeitunterstützung nicht `gelinkter'
- Programme und den Compiler zuständig, 'System' ist lediglich für die
- Laufzeitunterstützung `gelinkter' Programme zuständig. Es müssen also
- beide Module korrigiert werden. Dazu ersetzt das Programm 'PATCH.TOS'
- die fehlerhaften Routinen in beiden Modulen durch neue (die hoffentlich
- fehlerfrei sind).
-
- Das Programm ist ziemlich unkomfortabel, aber da es wohl nur einmal
- benutzt wird, habe ich mir eine großartige Benutzeroberfläche (...dieses
- Wort: ist das nun die Oberfläche des Benutzers, also die Haut, oder was...)
- Am besten geht man nach folgendem Rezept vor:
-
-
- 1. PATCH.TOS, M2SHELL.OBM und SYSTEM.OBM in ein gemeinsames Verzeichnis
- kopieren (z.B. das Wurzelverzeichnis, nicht das Verzeichnis nehmen,
- in dem die Originalmodule stehen, sicher ist sicher... )
-
- 2. Das Programm starten
-
- 3. Auf die Frage, welches der Module gepatcht werden soll, mit '1' oder
- '2' antworten
-
- 4. Auf die Frage, welche Routinen gepatcht werden sollen, mit '6' (alle
- Routinen) antworten
-
-
- Auf dem Bildschirm erscheinen Meldungen, welche Routinen gerade gepatcht
- wurden.
-
-
- 5. Auf die Frage, ob weitergemacht werden soll, mit 'j' antworten
-
- 6. Schritte 3 und 4 für das andere Modul wiederholen. Die Frage bei
- Schritt 5 mit einem 'Return' beantworten
-
-
- Wer schon bei HK_LIB_1.1 einen Patch vorgenommen hat, nimmt sich nun
- entweder wieder eine Kopie der Originalmodule vor oder patcht die
- Routinen FCMPd und TRUNCd einzeln.
-
- Folgende Fehler können auftreten, wobei das Programm nach einer Meldung
- mit einem Tastendruck abgebrochen wird:
-
- - Die zu patchenden Module befinden sich nicht im gleichen Verzeichnis
- oder sind schreibgeschützt.
-
- - Die Module wurden schon gepatcht oder liegen in einer anderen Version
- vor (in diesem Fall müssten die Offset-Konstanten in PATCH.MOD
- entsprechend geändert werden, was allerdings voraussetzt, daß die
- Positionen der entsprechenden Routinen in SYSTEM.OBM und die Position
- von SYSTEM.OBM innerhalb von M2SHELL.OBM gesucht werden. Sollte mal
- eine neue Version von LPR-Modula erscheinen, werde ich die Konstanten
- entsprechend ändern).
-
- - Ein Fehler bei der Dateibearbeitung.
-
-
- Hinweis für Benutzer der auf Sammeldisk #1 (ST 285) enthaltenen Module
- für LPR-Modula: Die Module 'RealInOut' und 'LongMathLib0' benutzen zur Ver-
- meidung der Fehler, die bei LONGREAL-Division und -Konstanten entstehen, die
- Prozeduren "Rec" und "Long" bzw. begnügen sich mit REAL-Konstanten.
- Dies führt bei einer korrekten LONGREAL-Division erneut zu Ungenauigkeiten,
- sodaß in den beiden Modulen am besten sämtliche Aufrufe von "Long" und
- ersatzweise Verwendungen von REAL-Konstanten durch richtige LONGREAL-
- Konstanten ersetzt werden, und sämtliche Vorkommen von Multiplikationen
- mit der Funktion "Rec" - also z.B. x * Rec(y) - durch Divisionen ersetzt
- werden - im Beispiel also: x / y .
- Soweit ich das ausprobiert habe, reicht es im Modul 'RealInOut' auch
- folgendes zu tun (aber bitte nur als Notbehelf):
-
- Im Initialisierungsteil des Moduls (ziemlich am Ende der Datei) gibt es
- eine Zuweisung
-
- E14:=1.0E14;
-
- Diese ist durch
-
- E14:=1.0D14;
-
- zu ersetzen. Das reicht anscheinend schon für korrekte Ergebnisse; sicherer
- ist es aber auf alle Fälle, sämtliche `Hilslösungen' in der oben angegebenen
- Weise zu ersetzen. Bei 'LongMathLib0' habe ich bisher nicht ausprobiert, ob
- es auch hier reicht, nur bestimmte Werte oder Anweisungen zu ersetzen.
-
- Bei der Anpassung sollten die Hinweise für LONGREAL-Konstanten in
- LPR_M2.TXT: "LONG-Konstanten" beachtet werden. Statt negativer Konstanten
- werden z.B. positive deklariert, die dann bei der Anwendung mit negativem
- Vorzeichen benutzt werden, bzw. subtrahiert statt addiert werden.
-
- !! Es kann sein, daß sich der Quelltext PATCH,MOD nicht mehr zum erneuten
- Übersetzen bzw. Linken eignet, da sich die Schnittstellen zur HK_LIB geändert
- haben, und der Quelltext nicht angepasst wurde (reine Faulheit); wer also
- das ganze unbedingt neu übersetzen will, muß die Aufrufe der HK_LIB
- im Quelltext erst entsprechend ändern.
-
-